package com.cmc.cloud.cmclink.doc.service.so;

import com.cmc.cloud.cmclink.doc.entity.AttachmentDO;
import com.cmc.cloud.cmclink.doc.vo.sovo.attachmentvo.*;
import com.cmes.framework.common.pojo.PageResult;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分 Service 接口
 *
 * @author 招商轮船-管理员
 */
public interface AttachmentService {

    /**
     * 创建订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分
     *
     * @param createReqVO 创建信息
     */
    void createAttachment(@Valid AttachmentCreateReqVO createReqVO);

    /**
     * 创建订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分
     *
     * @param createReqVOList 创建信息
     */
    void createBatch(List<AttachmentCreateReqVO> createReqVOList);

    /**
     * 附件表统计信息
     *
     * @param referenceIds  关联ids
     * @param referenceType 类型
     * @return 统计信息
     */
    List<AttachmentCountVO> selectSumByReferenceIds(List<Long> referenceIds, String referenceType);

    /**
     * 创建 修改 删除
     *
     * @param referenceId   关联ID
     * @param referenceType 关联类型
     * @param newList       修改
     * @param oldList       原信息
     */
    public void createOrUpdateAndDeleteBatch(Long referenceId, String referenceType, List<AttachmentUpdateReqVO> newList, List<AttachmentRespVO> oldList);

    /**
     * 更新订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分
     *
     * @param updateReqVO 更新信息
     */
    void updateAttachment(@Valid AttachmentUpdateReqVO updateReqVO);

    /**
     * 删除订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分
     *
     * @param id 编号
     */
    void deleteAttachment(Long id);

    /**
     * 获得订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分
     *
     * @param id 编号
     * @return 订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分
     */
    AttachmentDO getAttachment(Long id);

    /**
     * 获得订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分列表
     *
     * @param ids 编号
     * @return 订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分列表
     */
    List<AttachmentDO> getAttachmentList(Collection<Long> ids);

    /**
     * 获得订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分分页
     *
     * @param pageReqVO 分页查询
     * @return 订舱附件表 提单附件表 单证所有附件都保存在这张表 通过类型区分分页
     */
    PageResult<AttachmentDO> getAttachmentPage(AttachmentPageReqVO pageReqVO);


    /**
     * 根据类型删除
     *
     * @param referenceIds  ids
     * @param referenceType SO SI
     */
    void deleteByReferenceIds(Collection<Long> referenceIds, String referenceType);


    /**
     * 通过订舱Id 查询
     *
     * @param referenceId   订舱Id
     * @param referenceType SO SI
     * @return 航程
     */
    List<AttachmentDO> seleteByReferenceId(Long referenceId, String referenceType);

    /**
     * 通过订舱Id 查询
     *
     * @param referenceIds   订舱Ids
     * @param referenceType SO SI
     * @return 航程
     */
    List<AttachmentDO> seleteByReferenceIds(List<Long> referenceIds, String referenceType);

    /**
     * 获得所有附件
     *
     * @param applyId   关联ID
     * @param applyType 关联类型
     * @return 附件列表
     */
    List<AttachmentRespVO> getAttachmentListAll(Long applyId, String applyType);

    /**
     * 创建或更新附件
     *
     * @param createReqVO 附件信息
     */
    void createOrUpdateAttachment(@Valid AttachmentUpdateReqVO createReqVO);
}
